"""
基本函数实现
提供使用中使用的获取随机数，时间等基本方法
"""
import random
import time
import datetime
import arrow as arrow
import math
import uuid


# -----------------------------------  随机  ----------------------------------------------


def get_randint(min_num=0, max_num=100):
    """
    函数说明：以变量格式传入最小值（$min_num）和最大值（$max_num）生成指定范围随机整数
    :param min_num: 最小数
    :param max_num: 最大数
    :return: number
    """
    return random.randint(min_num, max_num)


def get_rand(size=5):
    """
    函数说明：以变量格式传入（$size）指定位数参数，生成指定位数的随机数
    :param size: 指定位数
    :return: number
    """
    value = int(random.random() * math.pow(10, size))
    if len(str(value)) < size:
        value = value * math.pow(10, size - len(str(value)))
    return int(value)


def get_rand_chinese(size=1):
    """
    函数说明：以变量格式传入（$size）指定位数参数，生成指定位数随机中文
    引用函数实参示例：${get_rand_chinese(1)}，形参：${get_rand_chinese($size)}
    :param size: 输出中文字符的位数
    :return:
    """
    rand_str = ''
    for i in range(size):
        head = random.randint(0xb0, 0xf7)
        body = random.randint(0xa1, 0xf9)  # 在head区号为55的那一块最后5个汉字是乱码,为了方便缩减下范围
        val = f'{head:x}{body:x}'
        rand_str = rand_str + bytes.fromhex(val).decode('gb2312')
    return rand_str


def get_uuid(size=32):
    """
    函数说明：以变量格式传入（$size）指定位数参数，生成随机字符,默认32位
    :param size:
    :return:
    """
    return str(uuid.uuid1()).replace('-', '')[0:size]


def get_str_uuid():
    return str(uuid.uuid4()).replace("-", "")


# -----------------------------------  用例操作  ----------------------------------------------


def int_to_str(str):
    """
    函数说明：传入数字（str）转字段串，JS超过15位后，精度会丢失，
    :param str: 数字串
    :return:
    """
    try:
        return int(str)
    except:
        return str


def sum_number(num1=0, num2=0):
    """
    函数说明：传入数字1（num1），数字2（num2）参数返回两个数字相加结果
    :param num1: 数字1
    :param num2: 数字2
    :return:
    """
    try:
        total = num1 + num2
    except:
        total = "参数错误，请检查"
    return total


def get_sub_str(value, begin=0, end=1):
    """
    字符串截取
    :param value: 被截取的字符串
    :param begin: 开始索引
    :param end: 结束索引
    :return:
    """
    return value[begin:end]


def get_random_choice(seq):
    """
    列表中随机选取元素
    :param seq: 列表
    :return:
    """
    print(seq)
    seq_list = eval(seq)
    return random.choice(seq_list)


# -----------------------------------  时间 ----------------------------------------------
def get_timestamp():
    """
    函数说明：生成当前时间13位数的时间戳
    :return: timestamp
    """
    return int(round(time.time() * 1000))


def time_sleep(seconds=0):
    """
    函数说明：线程睡眠，对进程挂起,seconds:秒数
    :param seconds: 等待时间（单位秒）
    :return:
    """
    time.sleep(seconds)


def get_time(time_type=1, day=0, add_time_unit="days"):
    """
    函数说明：传入时间格式类型（time_type），增加天数（day）生成当前时间字符
    :param time_type: 时间格式类型
    :param day: 增加天数 0为今天，1为明天，-1为昨天
    :param add_time_unit: 增加时间单位
    :return:
    """
    format_json = {
        1: '%Y-%m-%d %H:%M:%S',
        2: '%Y-%m-%d %H:%M',
        3: '%Y-%m-%d %H',
        4: '%Y-%m-%d',
        5: '%Y-%m',
        6: '%Y',
        7: '%Y%m%d%H%M%S',
        8: '%Y%m%d%H%M',
        9: '%Y%m%d%H',
        10: '%Y%m%d',
        11: '%Y%m',
        12: '%M',
        13: '%d',
        14: '%H',
        15: '%M',
        16: '%S',
        17: '%Y-%m-%dT%H:%M:%S'
    }

    data_format = format_json.get(time_type)
    if add_time_unit == 'hours':
        return (datetime.datetime.now() + datetime.timedelta(hours=day)).strftime(data_format)
    if add_time_unit == 'minutes':
        return (datetime.datetime.now() + datetime.timedelta(minutes=day)).strftime(data_format)
    if add_time_unit == 'seconds':
        return (datetime.datetime.now() + datetime.timedelta(seconds=day)).strftime(data_format)
    if add_time_unit == 'weeks':
        return (datetime.datetime.now() + datetime.timedelta(weeks=day)).strftime(data_format)

    return (datetime.datetime.now() + datetime.timedelta(days=day)).strftime(data_format)


def get_today_start():
    """
    函数说明：获取今天开始时间
    引用函数实参格式：${get_today_start()}
    """
    now = arrow.utcnow().to("local")
    return now.floor("day").format('YYYY-MM-DD HH:mm:ss')


def get_today_start_timestamp():
    """
    函数说明：获取今天开始时间搓
    """
    return int(time.mktime(time.strptime(str(get_today_start()), '%Y-%m-%d %H:%M:%S')) * 1000)


def get_today_end():
    """
    函数说明：获取今天结束时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.ceil("day").format('YYYY-MM-DD HH:mm:ss')


def get_today_end_timestamp():
    """
    函数说明：获取今天开始时间戳
    """
    return int(time.mktime(time.strptime(str(get_today_end()), '%Y-%m-%d %H:%M:%S')) * 1000)


def get_week_start():
    """
    函数说明：获取当前周开始时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.floor("week").format('YYYY-MM-DD HH:mm:ss')


def get_week_end():
    """
    函数说明：获取当前周结束时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.ceil("week").format('YYYY-MM-DD HH:mm:ss')


def get_month_start():
    """
    函数说明：获取当前月开始时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.floor("month").format('YYYY-MM-DD HH:mm:ss')


def get_month_end():
    """
    函数说明：获取当前月结束时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.ceil("month").format('YYYY-MM-DD HH:mm:ss')


def get_quarter_start():
    """
    函数说明：获取当前季度开始时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.floor("quarter").format('YYYY-MM-DD HH:mm:ss')


def get_quarter_end():
    """
    函数说明：获取当前季度结束时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.ceil("quarter").format('YYYY-MM-DD HH:mm:ss')


def get_year_start():
    """
    函数说明：获取当前年开始时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.floor("year").format('YYYY-MM-DD HH:mm:ss')


def get_year_end():
    """
    函数说明：获取当前年开始时间，格式：YYYY-MM-DD HH:mm:ss
    """
    now = arrow.utcnow().to("local")
    return now.ceil("year").format('YYYY-MM-DD HH:mm:ss')
